#include <glib-2.0/glib/glist.h>
#include "structures.h"

#ifndef _SUPERPEER_H
#define	_SUPERPEER_H

#ifdef	__cplusplus
extern "C" {
#endif
    // funzione di confronto per la ricerca di un elemento nella glist per le strutture FILE_IN_SUPER_PEER
    gint compare_FILE_IN_SUPER_PEER(gconstpointer a, gconstpointer b);
    // funzione di confronto per la ricerca di un elemento nella glist per le strutture CHUNK_IN_SUPER_PEER
    gint compare_CHUNK_IN_SUPER_PEER(gconstpointer a, gconstpointer b);
    // compara i peer secondo ip e porta
    gint compare_PEER(gconstpointer a, gconstpointer b);
    // stampa la lista dei peer connessi
    int print_connected_peer(GList *connectedPeer);
    // stampa la lista dei possessori
    int print_possessors_list(GList *poss);
    // stampa la lista dei chunk
    int print_CHUNK_IN_SUPERPEER_list(GList *list);
    // stampa la lista dei file
    int print_FILE_IN_SUPER_PEER_list(GList *list);
    //inserisce nel sistema un nuovo peer in modo atomico
    int insertNewPeer(struct PEER* newPeer, int numCompleteFile, char* hashCompleteFiles , int numChunkLite,
        struct chunkLight* chunksLite);
    // rimozione del peer
    int removePeer(struct PEER* peerToRemove);
    // inserimento di un nuovo  file
    int insertNewFile(struct FILE_IN_SUPER_PEER* newFile,struct chunk* chunkArray, int chunkNumber, int peerLoad, float peerAva, char* peerIP, int peerPort);
    int insertNewPeerInCompletePossessorsList(char* hashFile, struct PEER* newPeer);
    int insertNewChunkInPossessorsList(char* hashFile, char* hashChunk, struct PEER* newPeer);

#ifdef	__cplusplus
}
#endif

#endif	/* _SUPERPEER_H */

